package ch.heigvd.amt.mvcdemo.web.controllers; import ch.heigvd.amt.mvcdemo.util.Chance; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.math.BigDecimal; import javax.json.Json; import javax.json.JsonArrayBuilder; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * This servlet demonstrates that a servlet (and a JSP) can generate other * content than HTML. In this case, we generate a JSON payload. * * We do not follow the MVC pattern, in the sense that we generate the payload * directly in the servlet, but in this case it is a reasonable choice. * * In the example, we also show one method for creating JSON objects via a Java * API and for serializing these objects in string payloads. Note that later in * the course, we will study alternative methods (less verbose). * * @author Olivier Liechti (olivier.liechti@heig-vd.ch) */ @WebServlet(name = "JsonServlet", urlPatterns = {"/data/json"}) public class JsonServlet extends HttpServlet { /** * Handles the HTTP <code>GET</code> method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* Firstly, set the Content-type header to the right value */ response.setContentType("application/json;charset=UTF-8"); /* Secondly, build a JSON object with a "fluent" API */ JsonObjectBuilder builder = Json.createObjectBuilder().add("people", Json.createArrayBuilder()); JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); int numberOfPeople = 2 + (int)(Math.random() * 5); for (int i=0; i<numberOfPeople; i++) { arrayBuilder.add(Json.createObjectBuilder() .add("firstName", Chance.randomFirstName()) .add("lastName", Chance.randomLastName()) .add("id", (int)(Math.random() * 10000))); } JsonObject model = builder .add("people", arrayBuilder) .build(); /* Thirdly, serialize the JSON object to a string value */ StringWriter stWriter = new StringWriter(); JsonWriter jsonWriter = Json.createWriter(stWriter); jsonWriter.writeObject(model); jsonWriter.close(); String jsonPayload = stWriter.toString(); /* Finally, send the serialized JSON payload to the client */ try (PrintWriter out = response.getWriter()) { out.println(jsonPayload); } } }